package com.company.ljh.medium;

import com.company.ljh.utils.ListNode;

/**
 * @description:
 * 2095. 删除链表的中间节点
 * 提示
 * 中等
 * 42
 * 相关企业
 * 给你一个链表的头节点 head 。删除 链表的 中间节点 ，并返回修改后的链表的头节点 head 。
 *
 * 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点（下标从 0 开始），其中 ⌊x⌋ 表示小于或等于 x 的最大整数。
 *
 * 对于 n = 1、2、3、4 和 5 的情况，中间节点的下标分别是 0、1、1、2 和 2 。
 * @projectName:leet_code
 * @see:com.company.ljh.medium
 * @author:ljh
 * @createTime:2023/7/4 14:33
 * @version:1.0
 */
public class 删除链表的中间节点 {
    //注意边界情况，快指针走两步，慢指针走一步，当快指针走到null或者走到最后一个节点时，慢指针走到需要删除的节点，因此需要保存慢指针的前置节点
    public ListNode deleteMiddle(ListNode head) {
        //快慢指针
        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = slow;
        while(fast!=null && fast.next != null){
            fast = fast.next.next;
            pre = slow;
            slow = slow.next;
        }

        if(pre != slow){
            pre.next = slow.next;
        }else{
            //当链表只有自身节点的情况，慢指针和前置指针是同一个节点，需要删除自己
            head = null;
        }

        return head;
    }

}
